package com.lahuan.demo.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.web.bind.annotation.*;

import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import lombok.RequiredArgsConstructor;
import com.lahuan.common.Result;
import com.lahuan.demo.service.OrderService;
import com.lahuan.demo.entity.Order;
import javax.validation.Valid;
import java.util.List;

/**
 * <p>
 * 订单 控制器
 * </p>
 * @author lahuan
 * @since 2021-12-15
 */
@RequiredArgsConstructor
@RestController
@Slf4j
@Api(value = "t_order", tags = "订单接口")
@RequestMapping("/demo/order")
public class OrderController {

    private final OrderService orderService;

    /**
     * 抛弃了页码参数
     * 需要传递的参数为上一页的最大id和每页大小
     * 当上一页的最大id未传的时候，id视为0
     * 然后通过传递的id为条件进行查询
     * 通过走主键索引+limit进行分页
     * 还将数量和数据，拆分成了2个接口，避免count接口过慢影响整体效率
     * 数据查询接口通常可以保持在30ms左右返回
     * 数量接口执行较慢，通常需要800ms-900ms
     * @param pageSize
     * @param lastId
     * @return
     */
    @ApiOperation(value = "获取订单分页列表(非精确)",notes="获取订单分页列表(非精确)")
    @GetMapping("/imprecise")
    public  Result<List<Order>> imprecisePage(@RequestParam long pageSize,@RequestParam(required = false) Long lastId) {
        //如果想要更快 可以把count缓存起来，增删改时将缓存删除c
        LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<>();
        if(lastId !=null ){
            //必须传lastId，并且页码大于1才会触发条件
            //否则视为第一页
            wrapper.gt(Order::getId,lastId);
        }else{
            //传id参数 走主键索引
            wrapper.gt(Order::getId,0);
        }
        wrapper.orderByAsc(Order::getId);
        wrapper.last("limit "+ pageSize);
        List<Order> records = orderService.list(wrapper);
        return Result.ok(records);
    }

    @ApiOperation(value = "获取订单总数",notes="获取订单总数")
    @GetMapping("/count")
    public  Result<Integer> impreciseCount() {
        //如果想要更快 可以把count缓存起来，增删改时将缓存删除
        return Result.ok(orderService.count());
    }

}
